package xing.application.api;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import xing.application.api.client.WeChatClient;
import xing.application.service.user.UserService;
import xing.domain.user.User;
import xing.infrastructure.data.CallResult;
import xing.infrastructure.util.Aes;

import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;

/********************************
 * 文 件 名 :WechatApi.java
 * 创 建 人：陈天龙
 * 日    期：2017/10/16
 * 描   述：微信小程序api
 * 版 本 号：v1.0.0
 ********************************/
@Component
public class WechatApi {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private @Value("${web.wechat.appId}") String appId;

    private @Value("${web.wechat.appSecret}") String appSecret;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private WeChatClient weChatClient;

    @Autowired
    private UserService userService;
    /**
     * 描   述：获取session_key和openid
     * 创 建 人：陈天龙
     * 日    期：2017/10/16
     * @return String
     */
    public String jscode2Session(String jscode) {
        String res = null;
        try {
            res = weChatClient.getCommand("jscode2session",
                    "appid="+appId+"&secret="+appSecret+"&js_code="+jscode+"&grant_type=authorization_code");
            logger.info("appid="+appId+"&secret="+appSecret+"&js_code="+jscode);
        } catch (Exception e) {
            logger.error("获取session失败",e);
        }
        return res;
    }

    /**
     * 描   述：解密用户信息
     * 创 建 人：陈天龙
     * 日    期：2017/10/16
     * @desType 1:用户信息 2手机号
     * @return String
     */
    public CallResult decodeUserInfo(String encryptedData, String iv, String sessionId, int desType){
        Object sessionObj = redisTemplate.opsForValue().get(sessionId);
        if(null == sessionObj){
            return  CallResult.error("请重新登录");
        }
        String wxSessionStr = (String)sessionObj;
        String sessionKey = wxSessionStr.split("\\|")[0];
        try {
            Aes aes = new Aes();
            byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));
            if(null != resultByte && resultByte.length > 0){
                String userInfo = new String(resultByte, "UTF-8");
                JSONObject jsonObject=JSONObject.parseObject(userInfo);
                if(desType==1){//解密用户信息 如果用户已入库，取出phone给前端
                    String openId= jsonObject.getString("openId");
                    if(StringUtils.isEmpty(openId)){
                        logger.error("无openId");
                        return CallResult.error("无openId");
                    }
                    User u= userService.getUserInfo(openId);
                    if(u==null){
                        return CallResult.error("用户不存在！",jsonObject);
                    }
                    //存在用户，就存在phone，取出phone
                    jsonObject.put("phone",u.getPhone());
                    return CallResult.ok(jsonObject);
                }
                else{
                    return CallResult.ok(jsonObject);
                }

            }
        } catch (InvalidAlgorithmParameterException e) {
            logger.error("解密用户信息失败",e);
            return CallResult.error("解密用户信息失败");
        } catch (UnsupportedEncodingException e) {
            logger.error("解密用户信息失败",e);
            return  CallResult.error("解密用户信息失败");
        }

        return CallResult.ok("");
    }
}
